﻿-------------------------------------------------------------------------------
-- Такой же путь & Текущая папка. © SimSU
-------------------------------------------------------------------------------

---- Настройки
local function Settings()
-- Начало файла Profile\SimSU\Shell_SamePath.cfg
return{
  Key="Alt="; --Prior=50;
  KeyFolder="Alt-"; --PriorFolder=50;
  KeyLeft="AltRight"; --PriorLeft=50;
  KeyRight="AltLeft"; --PriorRight=50;
  KeyAutoOnOff="CtrlAlt="; --PriorAutoOnOff=50;
  KeyAuto="MsLClick Up Down Left Right Home End Ins ShiftMsLClick ShiftUp ShiftDown ShiftLeft ShiftRight ShiftHome ShiftEnd"; --PriorAuto=50;
  KeyAutoUp="CtrlPgUp Space"; PriorAutoUp=51;
}
-- Конец файла Profile\SimSU\Shell_SamePath.cfg
end

---- Локализация
_G.far.lang=far.lang or win.GetEnv("farlang")
-- Встроенные языки / Buildin laguages
local function Messages()
if far.lang=="Russian" then
-- Начало файла Profile\SimSU\Shell_SamePathRussian.lng
return{
  Descr="Установить на пассивной панели такой же путь как и на активной. © SimSU";
  DescrFolder="Открыть на пассивной панели папку под курсором активной панели. © SimSU";
  DescrLeft="Открыть на правой панели папку под курсором левой панели. © SimSU";
  DescrRight="Открыть на левой панели папку под курсором правой панели. © SimSU";
  DescrAutoOnOff="Включить/выключить автоматическое открытие папок. © SimSU";
  DescrAuto="Перемещение по панели с автоматическим открытием папок. © SimSU";
  DescrAutoUp="Автоматическое открытие папки при выходе из папки. © SimSU";
}
-- Конец файла Profile\SimSU\Shell_SamePathRussian.lng
else--if far.lang=="English" then
-- Begin of file Profile\SimSU\Shell_SamePathEnglish.lng
return{
  Descr="Установить на пассивной панели такой же путь как и на активной. © SimSU";
  DescrFolder="Открыть на пассивной панели папку под курсором активной панели. © SimSU";
  DescrLeft="Открыть на правой панели папку под курсором левой панели. © SimSU";
  DescrRight="Открыть на левой панели папку под курсором правой панели. © SimSU";
  DescrAutoOnOff="Включить/выключить автоматическое открытие папок. © SimSU";
  DescrAuto="Перемещение по панели с автоматическим открытием папок. © SimSU";
  DescrAutoUp="Автоматическое открытие папки при выходе из папки. © SimSU";
}
-- End of file Profile\SimSU\Shell_SamePathEnglish.lng
end end

local M=(loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Shell_SamePath"..far.lang..".lng") or Messages)()
local S=(loadfile(win.GetEnv("FARLOCALPROFILE").."\\SimSU\\Shell_SamePath.cfg") or loadfile(win.GetEnv("FARPROFILE").."\\SimSU\\Shell_SamePath.cfg") or Settings)()

local SimSU=SimSU or {}
SimSU.Shell_SamePath={}
-------------------------------------------------------------------------------
local FolderAuto=false

function SimSU.Shell_SamePath.FilePanelOn(PANEL) -- Включение Файловых панелей
  if not PANEL then SimSU.Shell_SamePath.FilePanelOn(APanel); SimSU.Shell_SamePath.FilePanelOn(PPanel); return end
  if PANEL==APanel and not APanel.Visible then Keys("CtrlO"); if PPanel.Visible then Keys("CtrlP") end end
  if PANEL==PPanel and not PPanel.Visible then if APanel.Visible then Keys("CtrlP") else Keys("CtrlO"); if not PPanel.Visible then Keys("CtrlP") end end end
  if PANEL.Type==1 then Keys("CtrlT") -- Если надо выключаем режим дерева.
  elseif PANEL.Type==2 then Keys("CtrlQ") -- Если надо выключаем режим быстрого просмотра.
  elseif PANEL.Type==3 then Keys("CtrlL") end -- Если надо выключаем режим информации.
end

function SimSU.Shell_SamePath.SetPath(PANEL,PATH,CURRENT,PLUGIN,HOSTFILE)
  if PATH then
    PANEL= PANEL or APAnel
    if PLUGIN=="00000000-0000-0000-0000-000000000000" then
      panel.SetPanelDirectory(nil,PANEL==APanel and 1 or 0,PATH)
      _ = SimSU.Shell_RememberSelected and SimSU.Shell_RememberSelected.Restore and SimSU.Shell_RememberSelected.Restore(PANEL)
    else
      panel.SetPanelDirectory(nil,PANEL==APanel and 1 or 0,{Name=PATH:find("%\\%.%.") and PATH:sub(1,-4) or PATH,Param="",PluginId=win.Uuid(PLUGIN),File=HOSTFILE})
      _ = SimSU.Shell_RememberSelected and SimSU.Shell_RememberSelected.Restore and SimSU.Shell_RememberSelected.Restore(PANEL)
    end
  end
  if CURRENT then Panel.SetPos(PANEL==APanel and 0 or 1, CURRENT) end
end

function SimSU.Shell_SamePath.SamePath()
  if APanel.FilePanel then
    _ = SimSU.Shell_RememberSelected and SimSU.Shell_RememberSelected.Save and SimSU.Shell_RememberSelected.Save(APanel)
    SimSU.Shell_SamePath.FilePanelOn(PPanel)
    local PD=panel.GetPanelDirectory(nil,1)
    SimSU.Shell_SamePath.SetPath(PPanel,PD.Name,APanel.Current,win.Uuid(PD.PluginId),PD.File)
  end
end

function SimSU.Shell_SamePath.Folder(PANEL)
  PANEL= PANEL or APanel
  if Area.Shell and PANEL.FilePanel and PANEL.Folder then
    SimSU.Shell_SamePath.FilePanelOn(PPanel)
    local PD=panel.GetPanelDirectory(nil,PANEL==APanel and 1 or 0)
    SimSU.Shell_SamePath.SetPath(PANEL==PPanel and APanel or PPanel,PD.Name.."\\"..PANEL.Current,nil,win.Uuid(PD.PluginId),PD.File)
  else
    SimSU.Shell_SamePath.SamePath()
  end
end

function SimSU.Shell_SamePath.Left(LEFT)
  SimSU.Shell_SamePath.Folder(LEFT and PPanel.Left and PPanel or LEFT==false and APanel.Left and PPanel or APanel)
end

function SimSU.Shell_SamePath.AutoTurn()
  FolderAuto= not FolderAuto
  if FolderAuto then
    SimSU.Shell_SamePath.Folder(APanel)
  end
end

function SimSU.Shell_SamePath.Up()
  _ = SimSU.Shell_RememberSelected and SimSU.Shell_RememberSelected.Auto and SimSU.Shell_RememberSelected.Auto(APanel,"CtrlPgUp") or Keys("CtrlPgUp"); SimSU.Shell_SamePath.Folder()
end

-------------------------------------------------------------------------------
if not Macro then return {Shell_SamePath=SimSU.Shell_SamePath} end

local ok, mod = pcall(require,"SimSU.Shell_SamePath"); if ok then SimSU=mod else _G.SimSU=SimSU end
local ok, mod = pcall(require,"SimSU.Shell_RememberSelected"); if ok then SimSU.Shell_RememberSelected=mod.Shell_RememberSelected end
-------------------------------------------------------------------------------

Macro {area="Shell Info QView Tree"; key=S.Key; priority=S.Prior; description=M.Descr;
  action=SimSU.Shell_SamePath.SamePath;
}
Macro {area="Shell"; key=S.KeyFolder; priority=S.PriorFolder; description=M.DescrFolder; flags="NoFiles";
  action=SimSU.Shell_SamePath.Folder;
}
Macro {area="Shell Info QView Tree"; key=S.KeyLeft; priority=S.PriorLeft; description=M.DescrLeft; flags="NoFiles";
  action=function() SimSU.Shell_SamePath.Left(true) end;
}
Macro {area="Shell Info QView Tree"; key=S.KeyRight; priority=S.PriorRight; description=M.DescrRight; flags="NoFiles";
  action=function() SimSU.Shell_SamePath.Left(false) end;
}
Macro {area="Shell Info QView Tree"; key=S.KeyAutoOnOff; priority=S.PriorAutoOnOff; description=M.DescrAutoOnOff;
  action=SimSU.Shell_SamePath.AutoTurn;
}
Macro {area="Shell"; key=S.KeyAuto; priority=S.PriorAuto; description=M.DescrAuto; flags="EmptyCommandLine";
  condition=function() return FolderAuto and Mouse.EventFlags~=2 end;
  action=function() Keys("AKey"); SimSU.Shell_SamePath.Folder() end;
}
Macro {area="Shell"; key=S.KeyAutoUp; priority=S.PriorAutoUp; description=M.DescrAutoUp;
  condition=function() return FolderAuto end;
  action=SimSU.Shell_SamePath.Up;
}
